/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.utn.tpsimulacion06;

import java.util.ArrayList;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author juan
 */
public class Puerto {

    Grua grua1;
    Grua grua2;
    Muelle muelle1;
    Muelle muelle2;
    Bahia bahia;
    Barco B;
    JTable tabla;
    DefaultTableModel dtm;
    ArrayList vectorAnterior = new ArrayList();
    ArrayList vectorNuevo = new ArrayList();
    Object[] fila;
    static double reloj = 0;
    String EVT = "";
    double randomLlegada = 0;
    double tiempoEntreLlegadas = 0;
    double tiempoProxLlegada = 0;
    String estadoMuelle1 = "L";
    String estadoMuelle2 = "L";
    double inicioTiempoDescargaG1 = 0;
    double randomDescargaG1 = 0;
    boolean dosGruasEnM1 = false;
    double tiempoDescargaG1 = 0;
    double tiempoRecalculadoG1 = 0;
    double tiempoFinDescargaG1 = 0;
    String estadoG1 = "L";
    double inicioTiempoDescargaG2 = 0;
    double randomDescargaG2 = 0;
    boolean dosGruasEnM2 = false;
    double tiempoDescargaG2 = 0;
    double tiempoRecalculadoG2 = 0;
    double tiempoFinDescargaG2 = 0;
    String estadoG2 = "L";
    double cola = 0;
    //El random que se tira para saber cuando va a ser el proximo bloqueo.
    double randomProximoBloqueo = 0;
    //Resultado del calculo por euler del tiempo en el que se va a bloquear
    //el servidor.
    double tiempoEntreBloqueos = 0;
    //tiempo de la simulacion en la que se va a bloquear el servidor.
    double tiempoProximoBloqueo = 0;
    /*
     * Una vez que se produce el bloqueo, hay que esperar a que se vacie la
     * memoria del servidor.
     */
    double tiempoFinLiberacionRecursos = 0;
    // Bandera que ayuda a controlar en eventos si la grua esta trabajando.
    boolean estaBloqueada = false;
    /*
     * Cuando la grua se bloquea con un barco adentro, se guarda el tiempo
     * restante para descargarlo, asi cuando el reloj este en
     * tiempoFinLiberacionRecursos, se sabe cuanto le falta por hacer.
     */
    double tiempoRestanteDespuesDeBloqueo = 0;
    double acumLlegadasBarco = 0;
    EulerManager eulerManager = new EulerManager(new JTable(), 0.1, 20);

    public Puerto(JTable tabla) {
        this.tabla = tabla;
        dtm = (DefaultTableModel) tabla.getModel();

        grua1 = new Grua(true, false, false);
        grua2 = new Grua(true, false, false);
        muelle1 = new Muelle(true);
        muelle2 = new Muelle(true);
        bahia = new Bahia();
    }

    public void simular() {


        while (reloj < 90) {
            if (reloj == 0) {
                //Calculo random para la llegada del primer barco
                randomLlegada = Math.random();
                tiempoEntreLlegadas = RandomsManager.getTiempoLlegadaBarco(randomLlegada);
                tiempoProxLlegada = reloj + tiempoEntreLlegadas;

                randomProximoBloqueo = Math.random();
                tiempoEntreBloqueos = eulerManager.getProximoBloqueo(randomProximoBloqueo);
                tiempoProximoBloqueo = reloj + tiempoEntreBloqueos;
                this.tiempoFinLiberacionRecursos = tiempoProximoBloqueo + 0.25;

                vectorNuevo.add(reloj); //reloj = 0; 0
                vectorNuevo.add(EVT); // EVT = ""; 1
                vectorNuevo.add(randomLlegada); //2
                vectorNuevo.add(tiempoEntreLlegadas); //3
                vectorNuevo.add(tiempoProxLlegada);//4
                vectorNuevo.add(estadoMuelle1);//5 "L"
                vectorNuevo.add(estadoMuelle2); //6 "L"
                vectorNuevo.add(inicioTiempoDescargaG1); //7
                vectorNuevo.add(randomDescargaG1); //8
                vectorNuevo.add(dosGruasEnM1); // 9
                vectorNuevo.add(tiempoDescargaG1); // 10
                vectorNuevo.add(tiempoRecalculadoG1); // 11
                vectorNuevo.add(tiempoFinDescargaG1); // 12
                vectorNuevo.add(estadoG1); //13 "L"
                vectorNuevo.add(inicioTiempoDescargaG2); //14
                vectorNuevo.add(randomDescargaG2); // 15
                vectorNuevo.add(dosGruasEnM2); //16
                vectorNuevo.add(tiempoDescargaG2); // 17
                vectorNuevo.add(tiempoRecalculadoG2); //18
                vectorNuevo.add(tiempoFinDescargaG2); //19
                vectorNuevo.add(estadoG2);//20 "L"
                vectorNuevo.add(cola); //21
                vectorNuevo.add(randomProximoBloqueo);
                vectorNuevo.add(tiempoEntreBloqueos);
                vectorNuevo.add(tiempoProximoBloqueo);
                vectorNuevo.add(tiempoFinLiberacionRecursos);
                vectorNuevo.add(estaBloqueada);
                vectorNuevo.add(tiempoRestanteDespuesDeBloqueo);

                //El vectorNuevo ahora pasa a ser el vectorAnterior, dodnde quedan guardados los datos!

                fila = vectorNuevo.toArray();
                dtm.addRow(fila);
                vectorAnterior.addAll(vectorNuevo);
                //System.out.println(vectorNuevo.toString());
                vectorNuevo.clear();

                if (this.tiempoProxLlegada < this.tiempoProximoBloqueo) {
                    llegadaBarco(tiempoProxLlegada);
                } else {
                    bloqueoGrua2(tiempoProximoBloqueo);
                }

            } else {

                if ((tiempoProxLlegada < tiempoFinDescargaG1 || tiempoFinDescargaG1 == 0) && tiempoFinDescargaG2 == 0 && tiempoProxLlegada < tiempoProximoBloqueo) {
                    llegadaBarco(tiempoProxLlegada);
                } else if ((tiempoProxLlegada < tiempoFinDescargaG2 || tiempoFinDescargaG2 == 0) && tiempoFinDescargaG1 == 0 && tiempoProxLlegada < tiempoProximoBloqueo) {
                    llegadaBarco(tiempoProxLlegada);
                } else if ((tiempoProxLlegada < tiempoFinDescargaG1 || tiempoFinDescargaG1 == 0) && (tiempoProxLlegada < tiempoFinDescargaG2 || tiempoFinDescargaG2 == 0) && tiempoProxLlegada < tiempoProximoBloqueo) {
                    llegadaBarco(tiempoProxLlegada);
                } else if (tiempoFinDescargaG1 == 0 && tiempoFinDescargaG2 == 0 && tiempoProxLlegada < tiempoProximoBloqueo) {
                    llegadaBarco(tiempoProxLlegada);
                } else if (tiempoFinDescargaG1 < tiempoProxLlegada && tiempoFinDescargaG2 == 0 && tiempoFinDescargaG1 < tiempoProximoBloqueo && tiempoFinDescargaG1 != 0) {
                    finDescarga(grua1, tiempoFinDescargaG1);
                } else if (tiempoFinDescargaG1 < tiempoProxLlegada && (tiempoFinDescargaG1 < tiempoFinDescargaG2 || tiempoFinDescargaG2 == 0) && tiempoFinDescargaG1 != 0 && tiempoFinDescargaG1 < tiempoProximoBloqueo) {
                    finDescarga(grua1, tiempoFinDescargaG1);
                } else if (tiempoFinDescargaG2 < tiempoProxLlegada && tiempoFinDescargaG1 == 0 && tiempoFinDescargaG2 < tiempoProximoBloqueo && tiempoFinDescargaG2 != 0) {
                    finDescarga(grua2, tiempoFinDescargaG2);
                } else if (tiempoFinDescargaG2 < tiempoProxLlegada && tiempoFinDescargaG2 < tiempoFinDescargaG1 && tiempoFinDescargaG2 != 0 && tiempoFinDescargaG2 < tiempoProximoBloqueo) {
                    finDescarga(grua2, tiempoFinDescargaG2);
                } else if (tiempoProximoBloqueo < this.tiempoProxLlegada && tiempoProximoBloqueo < this.tiempoFinDescargaG1 && (tiempoProximoBloqueo < this.tiempoFinDescargaG2 || tiempoFinDescargaG2 == 0)) {
                    bloqueoGrua2(tiempoProximoBloqueo);
                } else if (this.tiempoFinLiberacionRecursos < this.tiempoFinDescargaG1 && this.tiempoFinLiberacionRecursos < this.tiempoProxLlegada && tiempoFinLiberacionRecursos != 0) {
                    liberarRecursosGrua2(tiempoFinLiberacionRecursos);
                }
            }
        }
    }

    public void llegadaBarco(double proxLlb) {

        reloj = proxLlb;
        System.out.println("Llegada Barco" + reloj);
        EVT = "LLB";
        B = new Barco();

        //Calculo random para la llegada del siguiente barco...

        randomLlegada = Math.random();
        tiempoEntreLlegadas = RandomsManager.getTiempoLlegadaBarco(randomLlegada);
        tiempoProxLlegada = reloj + tiempoEntreLlegadas;

        acumLlegadasBarco++;

        asignarMuelle(proxLlb, B);
    }

    public void asignarMuelle(double llegadaBarco, Barco B) {
        boolean muelleAsignado = false;

        //Asigno algun muelle si alguno de los dos esta libre...
        if (muelle1.isEstalibre() == true) {
            muelleAsignado = true;
            muelle1.setEstaLibre(false);
            muelle1.setEstaOcupado(true);

            estadoMuelle1 = "O";

            if (grua1.isEstaOcupadaEnMuelle2() == true) {
                grua1.setEstaLibre(true);
                this.dosGruasEnM2 = false;
                grua1.setEstaOcupadaEnMuelle2(false);
                this.tiempoRecalculadoG2 = (grua2.getFinTiempoDescarga() - reloj) * 2;

                this.grua2.setTiempoRecalculado(tiempoRecalculadoG2);
                this.tiempoDescargaG2 = tiempoRecalculadoG2;
                this.grua2.setTiempoDescarga(tiempoDescargaG2);

                inicioTiempoDescargaG1 = llegadaBarco;
                grua1.setInicioTiempoDescarga(inicioTiempoDescargaG1);

                this.tiempoFinDescargaG2 = grua1.getInicioTiempoDescarga() + grua2.getTiempoDescarga();
                this.grua2.setFinTiempoDescarga(tiempoFinDescargaG2);

            }

            //Asigno alguna de las gruas o las dos si entan libres
            if (grua1.isEstaLibre() == true) {
                grua1.setEstaLibre(false);
                grua1.setEstaOcupadaEnMuelle1(true);
                grua1.setEstaOcupadaEnMuelle2(false);
                inicioTiempoDescargaG1 = llegadaBarco;
                estadoG1 = "OM1";
                grua1.setInicioTiempoDescarga(inicioTiempoDescargaG1);
                B.setLlegadaAMuelle(llegadaBarco);

                randomDescargaG1 = Math.random();
                tiempoDescargaG1 = RandomsManager.getTiempoDescarga(randomDescargaG1);
                grua1.setTiempoDescarga(tiempoDescargaG1);

                tiempoFinDescargaG1 = (grua1.getInicioTiempoDescarga() + grua1.getTiempoDescarga());
                grua1.setFinTiempoDescarga(tiempoFinDescargaG1);
                this.dosGruasEnM1 = false;
            }

            if (grua2.isEstaLibre() == true && !grua2.isBloqueda()) {
                grua2.setEstaLibre(false);
                grua2.setEstaOcupadaEnMuelle1(true);
                grua2.setEstaOcupadaEnMuelle2(false);
                //inicioTiempoDescargaG2 = reloj;
                estadoG2 = "OM1";
                //grua2.setInicioTiempoDescarga(inicioTiempoDescargaG2);
            }

            //Si asigne las dos gruas recalculo el tiempo...
            if ((grua1.isEstaOcupadaEnMuelle1() == true && grua2.isEstaOcupadaEnMuelle1() == true)) {
                dosGruasEnM1 = true;
                tiempoDescargaG1 = tiempoDescargaG1 / 2;
                grua1.setTiempoDescarga(tiempoDescargaG1);

                tiempoFinDescargaG1 = (grua1.getInicioTiempoDescarga() + grua1.getTiempoDescarga());
                grua1.setFinTiempoDescarga(tiempoFinDescargaG1);

//                randomDescargaG2 = randomDescargaG1;
//                tiempoDescargaG2=tiempoDescargaG1;
//                grua2.setTiempoDescarga(tiempoDescargaG2);
//                tiempoFinDescargaG2 = tiempoFinDescargaG1;
//                grua2.setFinTiempoDescarga(tiempoFinDescargaG2);
            }
        } else if (muelle2.isEstalibre() == true && muelleAsignado == false) {
            muelleAsignado = true;
            muelle2.setEstaLibre(false);
            muelle2.setEstaOcupado(true);
            estadoMuelle2 = "O";

            if (grua2.isEstaOcupadaEnMuelle1() == true && !grua2.isBloqueda()) {
                grua2.setEstaLibre(true);
                grua2.setEstaOcupadaEnMuelle1(false);
                this.dosGruasEnM1 = false;
                this.tiempoRecalculadoG1 = (grua1.getFinTiempoDescarga() - reloj) * 2;
                this.grua1.setTiempoRecalculado(tiempoRecalculadoG1);
                this.tiempoDescargaG1 = tiempoRecalculadoG1;
                this.grua1.setTiempoDescarga(tiempoRecalculadoG1);

                inicioTiempoDescargaG2 = llegadaBarco;
                grua2.setInicioTiempoDescarga(inicioTiempoDescargaG2);

                this.tiempoFinDescargaG1 = grua2.getInicioTiempoDescarga() + grua1.getTiempoDescarga();
                this.grua1.setFinTiempoDescarga(tiempoFinDescargaG1);

            }

            if (grua2.isEstaLibre() == true && !grua2.isBloqueda()) {
                grua2.setEstaLibre(false);
                grua2.setEstaOcupadaEnMuelle1(false);
                grua2.setEstaOcupadaEnMuelle2(true);
                inicioTiempoDescargaG2 = llegadaBarco;
                estadoG2 = "OM2";
                grua2.setInicioTiempoDescarga(inicioTiempoDescargaG2);
                B.setLlegadaAMuelle(llegadaBarco);

                dosGruasEnM2 = false;
                randomDescargaG2 = Math.random();
                tiempoDescargaG2 = RandomsManager.getTiempoDescarga(randomDescargaG2);
                grua2.setTiempoDescarga(tiempoDescargaG2);

                tiempoFinDescargaG2 = (grua2.getInicioTiempoDescarga() + grua2.getTiempoDescarga());
                grua2.setFinTiempoDescarga(tiempoFinDescargaG2);

            }

            if (grua1.isEstaLibre() == true) {
                grua1.setEstaLibre(false);
                grua1.setEstaOcupadaEnMuelle1(false);
                grua1.setEstaOcupadaEnMuelle2(true);
                //inicioTiempoDescargaG1 = reloj;
                estadoG1 = "OM2";
                //grua1.setInicioTiempoDescarga(inicioTiempoDescargaG1);                        
            }

            if ((grua1.isEstaOcupadaEnMuelle2() == true && grua2.isEstaOcupadaEnMuelle2() == true)) {
                dosGruasEnM2 = true;
                tiempoDescargaG2 = tiempoDescargaG2 / 2;
                grua2.setTiempoDescarga(tiempoDescargaG2);

                tiempoFinDescargaG2 = (grua2.getInicioTiempoDescarga() + grua2.getTiempoDescarga());
                grua2.setFinTiempoDescarga(tiempoFinDescargaG2);

//                randomDescargaG1 = randomDescargaG2;
//                tiempoDescargaG1=tiempoDescargaG2;
//                grua1.setTiempoDescarga(tiempoDescargaG1);
//                tiempoFinDescargaG1 = tiempoFinDescargaG2;
//                grua1.setFinTiempoDescarga(tiempoFinDescargaG1);
            }
        } //Si ninguno de los dos muelles esta libre, el barco va a la cola
        else {
            B.setLlegadaABahia(llegadaBarco);
            bahia.agregarBarco(B);
            cola = bahia.getCola();
        }

        actualizarVectorDeEstado();
    }

    public void finDescarga(Grua grua, double finTpoDescarga) {
        System.out.println("Fin Descarga:" + reloj);
        reloj = finTpoDescarga;
        EVT = "FD";
        boolean ayuda = false;

        if (bahia.getCola() > 0) {
            if (grua == grua1) {
                if (grua1.isEstaOcupadaEnMuelle1() == true) {
                    muelle1.setEstaLibre(true);
                    muelle1.setEstaOcupado(false);
                    grua1.setEstaLibre(true);
                    grua1.setEstaOcupadaEnMuelle1(false);

                    estadoMuelle1 = "L";
                    estadoG1 = "L";

                    if (grua2.isEstaOcupadaEnMuelle1() == true) {
                        estadoG2 = "L";
                        grua2.setEstaOcupadaEnMuelle1(false);
                        grua2.setEstaLibre(true);
                    }

                }

                if (grua1.isEstaOcupadaEnMuelle2() == true) {
                    muelle2.setEstaLibre(true);
                    muelle2.setEstaOcupado(false);
                    grua1.setEstaLibre(true);
                    grua1.setEstaOcupadaEnMuelle2(false);

                    estadoMuelle2 = "L";
                    estadoG1 = "L";

                    if (grua2.isEstaOcupadaEnMuelle2() == true) {
                        estadoG2 = "L";
                        grua2.setEstaOcupadaEnMuelle2(false);
                        grua2.setEstaLibre(true);
                    }
                }

                inicioTiempoDescargaG1 = 0;
                randomDescargaG1 = 0;
                dosGruasEnM1 = false;
                tiempoDescargaG1 = 0;
                tiempoRecalculadoG1 = 0;
                tiempoFinDescargaG1 = 0;

            }

            if (grua == grua2) {
                if (grua2.isEstaOcupadaEnMuelle1()) {
                    muelle1.setEstaLibre(true);
                    muelle1.setEstaOcupado(false);
                    grua2.setEstaLibre(true);
                    grua2.setEstaOcupadaEnMuelle1(false);
                    estadoMuelle1 = "L";
                    estadoG2 = "L";

                    if (grua1.isEstaOcupadaEnMuelle1() == true) {
                        estadoG1 = "L";
                        grua1.setEstaOcupadaEnMuelle1(false);
                        grua1.setEstaLibre(true);
                    }
                }

                if (grua2.isEstaOcupadaEnMuelle2()) {
                    muelle2.setEstaLibre(true);
                    muelle2.setEstaOcupado(false);
                    grua2.setEstaLibre(true);
                    grua2.setEstaOcupadaEnMuelle2(false);
                    estadoMuelle2 = "L";
                    estadoG2 = "L";

                    if (grua1.isEstaOcupadaEnMuelle2() == true) {
                        estadoG1 = "L";
                        grua1.setEstaOcupadaEnMuelle2(false);
                        grua1.setEstaLibre(true);
                    }


                }

                inicioTiempoDescargaG2 = 0;
                randomDescargaG2 = 0;
                dosGruasEnM2 = false;
                tiempoDescargaG2 = 0;
                tiempoRecalculadoG2 = 0;

            }

            Barco b = bahia.getBarco();
            b.setSalidaDeBahia(finTpoDescarga);
            bahia.quitarBarco();
            cola = bahia.getCola();
            this.asignarMuelle(finTpoDescarga, b);
        } else {
            if (grua == grua1) {
                if (grua1.isEstaOcupadaEnMuelle1() == true) {
                    muelle1.setEstaLibre(true);
                    muelle1.setEstaOcupado(false);
                    grua1.setEstaLibre(true);
                    grua1.setEstaOcupadaEnMuelle1(false);

                    estadoMuelle1 = "L";
                    estadoG1 = "L";

                    if (grua2.isEstaOcupadaEnMuelle1() == true) {
                        grua2.setEstaLibre(true);
                        grua2.setEstaOcupadaEnMuelle1(false);
                        estadoG2 = "L";
                    }

                    if (grua2.isEstaOcupadaEnMuelle2() == true) {
                        ayuda = true;
                        grua1.setEstaOcupadaEnMuelle2(true);
                        grua1.setEstaLibre(false);
                        estadoG1 = "OM2";
                        this.dosGruasEnM2 = true;
                        //Lo que me falta para terminar / 2;
                        this.tiempoRecalculadoG2 = (grua2.getFinTiempoDescarga() - reloj) / 2;

                        //Nuevo tiempo de descarga
                        this.tiempoDescargaG2 = tiempoRecalculadoG2;

                        //Seteo...
                        this.grua2.setTiempoRecalculado(tiempoRecalculadoG2);
                        this.grua2.setTiempoDescarga(tiempoDescargaG2);

                        this.tiempoFinDescargaG2 = reloj + tiempoDescargaG2;
                        this.grua2.setFinTiempoDescarga(tiempoFinDescargaG2);

                    }

                }

                if (grua1.isEstaOcupadaEnMuelle2() == true && ayuda == false) {
                    muelle2.setEstaLibre(true);
                    muelle2.setEstaOcupado(false);
                    grua1.setEstaLibre(true);
                    grua1.setEstaOcupadaEnMuelle2(false);

                    estadoMuelle2 = "L";
                    estadoG1 = "L";

                    if (grua2.isEstaOcupadaEnMuelle2() == true) {
                        grua2.setEstaLibre(true);
                        grua2.setEstaOcupadaEnMuelle2(false);
                        estadoG2 = "L";
                    }

                    if (grua2.isEstaOcupadaEnMuelle1() == true) {
                        ayuda = true;
                        grua1.setEstaOcupadaEnMuelle1(true);
                        grua1.setEstaLibre(false);
                        estadoG1 = "OM1";
                        this.dosGruasEnM1 = true;
                        //Lo que me falta para terminar / 2;
                        this.tiempoRecalculadoG2 = (grua2.getFinTiempoDescarga() - reloj) / 2;

                        //Nuevo tiempo de descarga
                        this.tiempoDescargaG2 = tiempoRecalculadoG2;

                        //Seteo...
                        this.grua2.setTiempoRecalculado(tiempoRecalculadoG2);
                        this.grua2.setTiempoDescarga(tiempoDescargaG2);

                        this.tiempoFinDescargaG2 = reloj + tiempoDescargaG2;
                        this.grua2.setFinTiempoDescarga(tiempoFinDescargaG2);

                    }

                }

                inicioTiempoDescargaG1 = 0;
                randomDescargaG1 = 0;
                dosGruasEnM1 = false;
                tiempoDescargaG1 = 0;
                tiempoRecalculadoG1 = 0;
                tiempoFinDescargaG1 = 0;
            }

            if (grua == grua2) {
                if (grua2.isEstaOcupadaEnMuelle1() == true) {
                    muelle1.setEstaLibre(true);
                    muelle1.setEstaOcupado(false);
                    grua2.setEstaLibre(true);
                    grua2.setEstaOcupadaEnMuelle1(false);
                    estadoMuelle1 = "L";
                    estadoG2 = "L";

                    if (grua1.isEstaOcupadaEnMuelle1() == true) {
                        grua1.setEstaLibre(true);
                        grua1.setEstaOcupadaEnMuelle1(false);
                        estadoG1 = "L";
                    }

                    if (grua1.isEstaOcupadaEnMuelle2() == true) {
                        ayuda = true;
                        grua2.setEstaOcupadaEnMuelle2(true);
                        grua2.setEstaLibre(false);
                        estadoG2 = "OM2";
                        this.dosGruasEnM2 = true;
                        //Lo que me falta para terminar / 2;
                        this.tiempoRecalculadoG1 = (grua1.getFinTiempoDescarga() - reloj) / 2;

                        //Nuevo tiempo de descarga
                        this.tiempoDescargaG1 = tiempoRecalculadoG1;

                        //Seteo...
                        this.grua1.setTiempoRecalculado(tiempoRecalculadoG1);
                        this.grua1.setTiempoDescarga(tiempoDescargaG1);

                        this.tiempoFinDescargaG1 = reloj + tiempoDescargaG1;
                        this.grua1.setFinTiempoDescarga(tiempoFinDescargaG1);

                    }

                }

                if (grua2.isEstaOcupadaEnMuelle2() == true) {
                    muelle2.setEstaLibre(true);
                    muelle2.setEstaOcupado(false);
                    grua2.setEstaLibre(true);
                    grua2.setEstaOcupadaEnMuelle2(false);
                    estadoMuelle2 = "L";
                    estadoG2 = "L";

                    if (grua1.isEstaOcupadaEnMuelle2() == true) {
                        grua1.setEstaLibre(true);
                        grua1.setEstaOcupadaEnMuelle2(false);
                        estadoG1 = "L";
                    }

                    if (grua1.isEstaOcupadaEnMuelle1() == true) {
                        ayuda = true;
                        grua2.setEstaOcupadaEnMuelle1(true);
                        grua2.setEstaLibre(false);
                        estadoG2 = "OM1";
                        this.dosGruasEnM1 = true;
                        //Lo que me falta para terminar / 2;
                        this.tiempoRecalculadoG1 = (grua1.getFinTiempoDescarga() - reloj) / 2;

                        //Nuevo tiempo de descarga
                        this.tiempoDescargaG1 = tiempoRecalculadoG1;

                        //Seteo...
                        this.grua1.setTiempoRecalculado(tiempoRecalculadoG1);
                        this.grua1.setTiempoDescarga(tiempoDescargaG1);

                        this.tiempoFinDescargaG1 = reloj + tiempoDescargaG1;
                        this.grua1.setFinTiempoDescarga(tiempoFinDescargaG1);

                    }
                }

                inicioTiempoDescargaG2 = 0;
                randomDescargaG2 = 0;
                dosGruasEnM2 = false;
                tiempoDescargaG2 = 0;
                tiempoRecalculadoG2 = 0;
                tiempoFinDescargaG2 = 0;

            }

            actualizarVectorDeEstado();
        }


    }

    private void bloqueoGrua2(double relojBloqueo) {

        Puerto.reloj = relojBloqueo;
        System.out.println("Bloqueo grua2: " + reloj);
        this.estaBloqueada = true;
        estadoG2 = "B";
        this.grua2.setBloqueda(true);
        this.grua2.setLiberada(false);
        this.tiempoFinLiberacionRecursos = reloj + 0.25;//6 hs para liberar rec
        tiempoProximoBloqueo = 0;
        if (grua2.isEstaOcupadaEnMuelle1()) {
            this.tiempoRestanteDespuesDeBloqueo = this.tiempoFinDescargaG2 - reloj;
            if (grua1.isEstaOcupadaEnMuelle1()) {
                this.tiempoDescargaG1 = this.tiempoRestanteDespuesDeBloqueo * 2;
                this.grua1.setTiempoDescarga(tiempoDescargaG1);
                this.tiempoFinDescargaG1 = reloj + this.tiempoDescargaG1;
                this.grua1.setFinTiempoDescarga(tiempoFinDescargaG1);
                this.tiempoFinDescargaG2 = 0;
                this.grua2.setFinTiempoDescarga(tiempoFinDescargaG2);
            } else {
                this.tiempoFinDescargaG2 = this.tiempoRestanteDespuesDeBloqueo + tiempoFinLiberacionRecursos;
                this.grua2.setFinTiempoDescarga(tiempoFinDescargaG2);
            }
        }
        if (grua2.isEstaOcupadaEnMuelle2()) {
            this.tiempoRestanteDespuesDeBloqueo = this.tiempoFinDescargaG2 - reloj;
            if (grua1.isEstaOcupadaEnMuelle2()) {
                this.tiempoDescargaG1 = this.tiempoRestanteDespuesDeBloqueo * 2;
                this.grua1.setTiempoDescarga(tiempoDescargaG1);
                this.tiempoFinDescargaG1 = reloj + this.tiempoDescargaG1;
                this.grua1.setFinTiempoDescarga(tiempoFinDescargaG1);
                this.tiempoFinDescargaG2 = 0;
                this.grua2.setFinTiempoDescarga(tiempoFinDescargaG2);
            } else {
                this.tiempoFinDescargaG2 = this.tiempoRestanteDespuesDeBloqueo + tiempoFinLiberacionRecursos;
                this.grua2.setFinTiempoDescarga(tiempoFinDescargaG2);
            }
        }
        if (grua2.isEstaLibre()) {
        }

        actualizarVectorDeEstado();

    }

    private void liberarRecursosGrua2(double horaFinLiberacionRecurso) {

        Puerto.reloj = horaFinLiberacionRecurso;
        System.out.println("Liberar Recursos grua 2: " + reloj);
        this.estaBloqueada = false;
        this.grua2.setBloqueda(false);
        this.grua2.setLiberada(true);
        randomProximoBloqueo = Math.random();
        tiempoEntreBloqueos = eulerManager.getProximoBloqueo(randomProximoBloqueo);
        tiempoProximoBloqueo = reloj + tiempoEntreBloqueos;
        this.tiempoFinLiberacionRecursos = 0;
        this.tiempoRestanteDespuesDeBloqueo = 0;

        if (grua1.isEstaOcupadaEnMuelle1()) {
            if (grua2.isEstaOcupadaEnMuelle1()) {
                this.tiempoDescargaG1 = tiempoDescargaG1 / 2;
                this.tiempoFinDescargaG1 = reloj + tiempoDescargaG1;
                this.grua1.setTiempoDescarga(tiempoDescargaG1);
                this.grua1.setFinTiempoDescarga(tiempoFinDescargaG1);

            }
        }

        if (grua1.isEstaOcupadaEnMuelle2()) {
            if (grua2.isEstaOcupadaEnMuelle2()) {
                this.tiempoDescargaG1 = tiempoDescargaG1 / 2;
                this.tiempoFinDescargaG1 = reloj + tiempoDescargaG1;
                this.grua1.setTiempoDescarga(tiempoDescargaG1);
                this.grua1.setFinTiempoDescarga(tiempoFinDescargaG1);

            }
        }




    }

    private void actualizarVectorDeEstado() {
        vectorNuevo.add(reloj); //reloj = 0; 0
        vectorNuevo.add(EVT); // EVT = ""; 1
        vectorNuevo.add(randomLlegada); //2
        vectorNuevo.add(tiempoEntreLlegadas); //3
        vectorNuevo.add(tiempoProxLlegada);//4
        vectorNuevo.add(estadoMuelle1);//5
        vectorNuevo.add(estadoMuelle2); //6
        vectorNuevo.add(inicioTiempoDescargaG1); //7
        vectorNuevo.add(randomDescargaG1); //8
        vectorNuevo.add(dosGruasEnM1); // 9
        vectorNuevo.add(tiempoDescargaG1); // 10
        vectorNuevo.add(tiempoRecalculadoG1); // 11
        vectorNuevo.add(tiempoFinDescargaG1); // 12
        vectorNuevo.add(estadoG1); //13
        vectorNuevo.add(inicioTiempoDescargaG2); //14
        vectorNuevo.add(randomDescargaG2); // 15
        vectorNuevo.add(dosGruasEnM2); //16
        vectorNuevo.add(tiempoDescargaG2); // 17
        vectorNuevo.add(tiempoRecalculadoG2); //18
        vectorNuevo.add(tiempoFinDescargaG2); //19
        vectorNuevo.add(estadoG2);//20
        vectorNuevo.add(cola); //21
        vectorNuevo.add(randomProximoBloqueo);
        vectorNuevo.add(tiempoEntreBloqueos);
        vectorNuevo.add(tiempoProximoBloqueo);
        vectorNuevo.add(tiempoFinLiberacionRecursos);
        vectorNuevo.add(estaBloqueada);
        vectorNuevo.add(tiempoRestanteDespuesDeBloqueo);
        fila = vectorNuevo.toArray();
        dtm.addRow(fila);
        System.out.println(vectorNuevo.toString());
        vectorAnterior.addAll(vectorNuevo);
        vectorNuevo.clear();
    }
}